多态身份(Profile)
Zero中由于复杂的多对多结构,最终会形成不同的多态身份(Profile),S_RESOURCE 表中有如下字段对资源访问资格执行定义:
| 字段名 | 含义 | 取值 |
|---|---|---|
MODE_ROLE |
按角色查找资源的模式 |
UNION、EAGER、LAZY、INTERSECT |
MODE_GROUP |
按用户组查找资源的模式 |
HORIZON、CRITICAL、OVERLOOK |
MODE_TREE |
用户组继承和非继承树模式查找 |
EXTEND、PARENT、CHILD、INHERIT |
上述取值是资源对多态身份的定义,最终形成的多态身份 Profile 的值列表如下(举例定义角色和组的优先级):
|
不含组模式
假设用户包含如下信息,这种模式(高频使用模式)下 MODE_GROUP / MODE_TREE 都设置成 NULL:
R1(H):P1、P2、P3,高优先级角色,包含三条权限记录。
R2(L):P2、P4,低优先级角色,包含两条权限记录。
| 值 | 含义 |
|---|---|
USER_UNION |
|
USER_EAGER |
|
USER_LAZY |
|
USER_INTERSECT |
|
用户组模式
假设用户包含如下信息:
用户组结构如下(此处不列举组所对应的权限集):
G10
/ \
G20 G21
/ \ \
G30 G31 G32
而登录用户只包含如下三个用户组:
G20(H):高优先级用户组
G31(M):中优先级用户组
G32(L):低优先级用户组
全量优先级:
G10 > G20 > G21 > G30 > G31 > G32
| 值 | 组计算 | 角色计算 | 计算流程 |
|---|---|---|---|
HORIZON_UNION |
UNION模式计算单个用户组关联角色权限集,再将三个组的权限集合并。 |
||
HORIZON_EAGER |
EAGER模式计算单个用户组关联角色权限集,再将三个组的权限集合并。 |
||
HORIZON_LAZY |
LAZY模式计算单个用户组关联角色权限集,再将三个组的权限集合并。 |
||
HORIZON_INTERSECT |
INTERSECT模式计算单个用户组关联角色权限集,再将三个组的权限集合并。 |
||
CRITICAL_UNION |
UNION模式计算高优先级组的权限集。 |
||
CRITICAL_EAGER |
EAGER模式计算高优先级组的权限集。 |
||
CRITICAL_LAZY |
LAZY模式计算高优先级组的权限集。 |
||
CRITICAL_INTERSECT |
INTERSECT模式计算高优先级的权限集。 |
||
OVERLOOK_UNION |
UNION模式计算低优先级组的权限集。 |
||
OVERLOOK_EAGER |
EAGER模式计算低优先级组的权限集。 |
||
OVERLOOK_LAZY |
LAZY模式计算低优先级组的权限集。 |
||
OVERLOOK_INTERSECT |
INTERSECT模式计算低优先级组的权限集。 |
||
PARENT_HORIZON_UNION |
先查找三个组的父组,再按UNION模式计算权限集。 |
||
PARENT_HORIZON_EAGER |
先查找三个组的父组,再按EAGER模式计算权限集。 |
||
PARENT_HORIZON_LAZY |
先查找三个组的父组,再按LAZY模式计算权限集。 |
||
PARENT_HORIZON_INTERSECT |
先查找三个组的父组,再按INTERSECT模式计算权限集。 |
||
PARENT_CRITICAL_UNION |
查找优先级最高组的父组,再按UNION模式计算权限集。 |
||
PARENT_CRITICAL_EAGER |
查找优先级最高组的父组,再按EAGER模式计算权限集。 |
||
PARENT_CRITICAL_LAZY |
查找优先级最高组的父组,再按LAZY模式计算权限集。 |
||
PARENT_CRITICAL_INTERSECT |
查找优先级最高组的父组,再按INTERSECT模式计算权限集。 |
||
PARENT_OVERLOOK_UNION |
查找优先级最低组的父组,再按UNION模式计算权限集。 |
||
PARENT_OVERLOOK_EAGER |
查找优先级最低组的父组,再按EAGER模式计算权限集。 |
||
PARENT_OVERLOOK_LAZY |
查找优先级最低组的父组,再按LAZY模式计算权限集。 |
||
PARENT_OVERLOOK_INTERSECT |
查找优先级最低组的父组,再按INTERSECT模式计算权限集。 |
||
CHILD_HORIZON_UNION |
查找所有组的子组,再按UNION模式计算权限集。 |
||
CHILD_HORIZON_EAGER |
查找所有组的子组,再按EAGER模式计算权限集。 |
||
CHILD_HORIZON_LAZY |
查找所有组的子组,再按LAZY模式计算权限集。 |
||
CHILD_HORIZON_INTERSECT |
查找所有组的子组,再按INTERSECT模式计算权限集。 |
||
CHILD_CRITICAL_UNION |
查找优先级最高组的子组,再按UNION模式计算权限集。 |
||
CHILD_CRITICAL_EAGER |
查找优先级最高组的子组,再按EAGER模式计算权限集。 |
||
CHILD_CRITICAL_LAZY |
查找优先级最高组的子组,再按LAZY模式计算权限集。 |
||
CHILD_CRITICAL_INTERSECT |
查找优先级最高组的子组,再按INTERSECT模式计算权限集。 |
||
CHILD_OVERLOOK_UNION |
(无权限)查找优先级最低组的子组,再按UNION模式计算权限集。 |
||
CHILD_OVERLOOK_EAGER |
(无权限)查找优先级最低组的子组,再按EAGER模式计算权限集。 |
||
CHILD_OVERLOOK_LAZY |
(无权限)查找优先级最低组的子组,再按LAZY模式计算权限集。 |
||
CHILD_OVERLOOK_INTERSECT |
(无权限)查找优先级最低组的子组,再按INTERSECT模式计算权限集。 |
||
INHERIT_HORIZON_UNION |
查找所有组父组包含本组,再按UNION模式计算权限集。 |
||
INHERIT_HORIZON_EAGER |
查找所有组父组包含本组,再按EAGER模式计算权限集。 |
||
INHERIT_HORIZON_LAZY |
查找所有组父组包含本组,再按LAZY模式计算权限集。 |
||
INHERIT_HORIZON_INTERSECT |
查找所有组父组包含本组,再按INTERSECT模式计算权限集。 |
||
INHERIT_CRITICAL_UNION |
查找优先级高组的父组包含本组,再按UNION模式计算权限集。 |
||
INHERIT_CRITICAL_EAGER |
查找优先级高组的父组包含本组,再按EAGER模式计算权限集。 |
||
INHERIT_CRITICAL_LAZY |
查找优先级高组的父组包含本组,再按LAZY模式计算权限集。 |
||
INHERIT_CRITICAL_INTERSECT |
查找优先级高组的父组包含本组,再按INTERSECT模式计算权限集。 |
||
INHERIT_OVERLOOK_UNION |
查找优先级低组的父组包含本组,再按UNION模式计算权限集。 |
||
INHERIT_OVERLOOK_EAGER |
查找优先级低组的父组包含本组,再按EAGER模式计算权限集。 |
||
INHERIT_OVERLOOK_LAZY |
查找优先级低组的父组包含本组,再按LAZY模式计算权限集。 |
||
INHERIT_OVERLOOK_INTERSECT |
查找优先级低组的父组包含本组,再按INTERSECT模式计算权限集。 |
||
EXTEND_HORIZON_UNION |
查找所有组子组包含本组,再按UNION模式计算权限集。 |
||
EXTEND_HORIZON_EAGER |
查找所有组子组包含本组,再按EAGER模式计算权限集。 |
||
EXTEND_HORIZON_LAZY |
查找所有组子组包含本组,再按LAZY模式计算权限集。 |
||
EXTEND_HORIZON_INTERSECT |
查找所有组子组包含本组,再按INTERSECT模式计算权限集。 |
||
EXTEND_CRITICAL_UNION |
查找优先级高组的子组包含本组,再按UNION模式计算权限集。 |
||
EXTEND_CRITICAL_EAGER |
查找优先级高组的子组包含本组,再按EAGER模式计算权限集。 |
||
EXTEND_CRITICAL_LAZY |
查找优先级高组的子组包含本组,再按LAZY模式计算权限集。 |
||
EXTEND_CRITICAL_INTERSECT |
查找优先级高组的子组包含本组,再按INTERSECT模式计算权限集。 |
||
EXTEND_OVERLOOK_UNION |
查找优先级低组的子组包含本组,再按UNION模式计算权限集。 |
||
EXTEND_OVERLOOK_EAGER |
查找优先级低组的子组包含本组,再按EAGER模式计算权限集。 |
||
EXTEND_OVERLOOK_LAZY |
查找优先级低组的子组包含本组,再按LAZY模式计算权限集。 |
||
EXTEND_OVERLOOK_INTERSECT |
查找优先级低组的子组包含本组,再按INTERSECT模式计算权限集。 |
|
多态身份Profile是整个 Zero权限框架中的一个 过度设计 的典范,从实际场景看起来真正使用到这部分的内容仅局限于 对用户而言,一旦登录之后,自己的 Profile 就已经固定,而资源需求要求的Profile则不一定固定,属于变量,最终计算结果近似于查找最短路径,达到用户组这个级别的额外的变化模式(包括继承、包括派生、包括限制、包括组合等),最终 Zero权限框架中合计支持64种Profile配置,如此就解决了资源 能不能 访问的问题。 |